import org.junit.Test;

import java.util.Arrays;

/**
 * 数组 Array
 * 数组相当于一堆相同数据类型的数据
 *
 */
public class 数组 {
    //数组的定义：四种，创建数组
    @Test
public void testArray(){
    //注意：数组长度固定，不能改变
    int[] arr1=new int[4];//Java推荐写法 动态初始化
    int arr2[]=new int[4];//C推荐写法Java兼容 动态初始化
    int[] arr3={1,2,3};//静态初始化数组，元素可以直接使用
    int[] arr4=new int[]{1,2,3};//动态初始化数组
    //数组：内部存数据叫元素？
    //从arr3里取出 2的元素  数组名 下标（下标是从0开始数）
    System.out.println(arr3[1]);
    //获取arr3的长度
        System.out.println(arr3.length);
    //从arr4获取到 第四个元素值
    //System.out.println(arr4[4]);//报错 ArrayIndexOutOfBoundsException
                                 //数组下标越界异常：下标超出数组长度范围
    }
/**
 * 数组的迭代（遍历：输出数组所有元素值）三种
 * 1.普通迭代方式：for
 * 2.增强for方式：推荐，JDK1.5之后
 * 3.工具类：Arrays
 */
@Test
    public void testIterate(){
    int[] arr={1,2,3,4};//静态初始化数组  数组名[下标]
//    for(int i=0;i<arr.length;i++){//拿数组下标
//        System.out.println(arr[i]);
//      }
    //2.增强for JDK1.5新循环 遍历数组目的：拿元素值 缺点：必须是相同类型，不是相同类型取不出来
    //语法：for（遍历类型 遍历引用：数组引用）{}
//		for(int j: arr) {//遍历类型
//            System.out.println(j);
//        }
        //工具类：Arrays.toString()直接打印数组元素值
    System.out.println(Arrays.toString(arr));
    }
    /**
     * 数组扩容
     */
    @Test
    public void testCopy(){
        //字符数组
        char[] arr={'唐','山'};//想法：长度增加为4
        //扩容：增加4个
        char[] temp=Arrays.copyOf(arr,4);
        arr=temp;
        arr[2]='工';
        arr[3]='业';
        System.out.println(arr);
        //需求：输出唐山工业
    }
    /**
     * 数组输出元素时，会有一些不同，【查看数据是否为数组】
     * 数据类型：基础数据类型+引用类型
     */
    @Test
    public void testArrays(){
        //字符数组
        char[] china={'中','国'};
        System.out.println(china); //输出：中国  字符串：字符数组
        //数值数组
        int[] i={1,2};
        System.out.println(i);//输出[I@4fb64261 （I是数据类型，@是连接符，4fb64261是地址值）
        //原因  输出语句--JavaOOP面向对象：重载，字符数组自动拼接
    }
    /**
     * 冒泡排序:双层for循环使用
     */
    @Test
    public void bubbleSort() {
        //静态初始化数组
        int[] arr = {3, 6, 4, 1};
        //①外层for i=0 1 2 3   3轮
        for (int i = 0;i<arr.length-1;i++) {
            //②内层for控制次   j= 递减-1
            for(int j=0;j<arr.length-1-i;j++){
                //③交换：创建第三方数组，接收【相邻元素】 数组名+下标拿元素
                if(arr[j]>arr[j+1]){
                //创建第三方数组，接受   变量名:temp
                    int temp=arr[j];  //大的元素交给第三方变量保存
                    arr[j]=arr[j+1];  //第二个元素交给第一个元素位置
                    arr[j+1]=temp;    //保存第三方变量【大数】交给第二个元素
                }
            }
        }
        System.out.println(Arrays.toString(arr));//输出数组就是遍历数组的意思
    }

    @Test
    public void testSort(){
        int[] arr={3,6,4,1};
        //工具类 Arrays.sort()方法排序，默认升序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
